package edu.java基础;
//数组：array,容器，用来存储同种类型的多个值

import java.util.Scanner;

public class N_数组 {
    public static void main(String[] args) {
        //定义格式：  数据类型[] 变量名 int[] array     /  数据类型  变量名[] int array[]
        int[] arr1;  //仅仅是定义了数组变量
        //int[] arr = 创建数组容器
        //动态初始化：只明确元素个数，不明确具体数值  数据类型[]变量名 = new 数据类型[数组长度];
        int[] arr = new int[3];  //动态初始化
        System.out.println(arr); //直接打印：[I@3ac3fd8b数组的内存地址
        //16进制，0 1 2 3 4 5 6 7 8 9 a b c d e f

        //数组的元素访问  没有数据时输出默认初始化值0
        arr[0] = 1;
        arr[1] = 2;
        arr[2] = 3;


        //静态初始化:不用限定长度，手动指定元素，用于已经明确了元素值
        int[] arr2 = new int[]{11, 22, 33};
        int[] arr3 = {11, 22, 33};  //简化格式

        //索引越界问题，访问了不存在的索引
        //空指针异常：访问的数组已经不在只想堆内存的数据


        //内存分配
        /*
        栈内存：方法（main方法）运行时进入的内存，局部变量（现在接触到的变量都是）都存放在栈内存中
        堆内存：new出来的内容会进入堆内存，并存在地址值
                每new一次，在堆内存中都是一块新空间，空间地址不会重复
        方法区：字节码文件（.class文件）加载时进入的内存

            看：栈。堆2.jpg，没有new就没有创建新的堆，arr2变量记录的是堆里的地址值

        本地方法栈：调用操作系统相关资源
        寄存器：交给cpu去使用
         */

        //数组遍历
        int[] arr4 = {11, 22, 33, 44, 55};
        int l = arr4.length;  //获取数组长度
        for (int i = 0; i < l; i++) {
            System.out.println(arr4[i]);
        }
        //获取最值
        int max = arr4[0];
        for (int i = 0; i < l; i++) {   //注意是“<‘ 而不是 ’<=‘
            if (arr4[i] > max) {
                max = arr4[i];
            }
        }
        System.out.println(max);

        //数组元素求和：键盘录入5个整数，存储到数组中，并求和
        Scanner sc = new Scanner(System.in);
        int sum = 0;
        int[] arr5 = new int[5];
        for (int i = 0; i < arr5.length; i++) {
            System.out.println("请输入第" + (i + 1) + "个整数");
            arr5[i] = sc.nextInt();  //键盘录入
        }
        //快捷键：数组名字.fori    arr5.fori
        for (int i = 0; i < arr5.length; i++) {
            sum += arr5[i];
        }
        System.out.println("sum:" + sum);


        //数组查找
        int[] arr6 = {19, 28, 62, 94, 52};
        Scanner sc1 = new Scanner(System.in);
        System.out.println("请输入你要查找的元素：");
        int num = sc1.nextInt();
        int index = -1;  //定义一个索引变量，初始值是-1，假设要查找的数据在数组中不存在
        for (int i = 0; i < arr6.length; i++) {
            if (num == arr6[i]) {
                index = i;  //如果值相同，把索引赋值给index
                break;
            }
        }
        System.out.println(index);


        //评委打分，6个评委打分0-100的整数分，最后得分取去掉一个最高分和最低分后的平均值
        int[] arr7 = new int[6];
        Scanner sc2 = new Scanner(System.in);
        for (int i = 0; i < arr7.length; i++) {
            System.out.println("请输入第" + (i + 1) + "个评委的打分");
            int scope = sc2.nextInt();
            if (scope >= 0 && scope <= 100) {
                //合法分值
                arr7[i] = scope;
            } else {
                //非法分值
                System.out.println("打分有误");
                i--;  //--在循环时有++，再次回到这个i
            }
        }

        //求最大值
        int max1 = arr7[0];
        for (int i = 0; i < arr7.length; i++) {
            if (max1 < arr7[i]) {
                max1 = arr7[i];
            }
        }
        //求最小值
        int min1 = arr7[0];
        for (int i = 0; i < arr7.length; i++) {
            if (min1 > arr7[i]) {
                min1 = arr7[i];
            }
        }
        //求总和
        int sum1=0;
        for (int i = 0; i <arr7.length ; i++) {
            sum1+=i;
        }
        //按照计算规则求平均分
        int ave = (sum1 - max1 - min1)/4;
        System.out.println("分数是："+ave);

    }
}
